Android之SQLite数据库操作 您所在的位置:网站首页 android id查询 Android之SQLite数据库操作

Android之SQLite数据库操作

2023-04-23 14:42| 来源: 网络整理| 查看: 265

设计一个简单的学生信息管理程序,数据库名称创建为”ciec”,学生信息包括学号(表的主键)、姓名、性别、班级等,结合SQLite数据库实现对学生信息的添加、修改、删除与查询操作。

实验步骤

创建一个Activity,界面布局如图1所示,用户通过界面输入或选择学生信息,点击添加按钮后,将信息保存到数据库中,并在界面中提示操作成功或失败的信息。注意:输入的学号为数据库表的主键,学号不能为空也不能重复,需要在程序中对学号的信息进行合法性验证。

点击修改按钮和删除按钮可以对学生信息进行相应操作,但必须预先输入学号信息,否则提示操作无法成功。

点击查询按钮后,先跳转到新的Activity,在新的界面中展示查询结果,要求将所有的学生信息都查询出来,并用列表控件进行展示,界面布局如图2所示。

                       图1                                                            图2

写了一天才写完,一开始写的时候一脸懵

说一下总共写了6个文件,Mainactivity,Secondactivity,DatabaseHelper,还有三个xml布局文件

先把布局文件贴出来

1 2 6 7 11 12 17 22 23 24 28 29 34 39 40 41 45 46 50 51 56 57 62 63 68 69 70 71 75 76 81 86 87 88 92 93 99 105 111 117 118 119 1 2 5 6 10 11 1 2 6 7 11 12

这三个xml,第一个对应Mainactivity,后两个对应Secondactivity。

第一次使用SQLlite,就先使用一下

 

 

 熟悉用法了,就可以开始写了

sqllite数据库是AndroidSDK自带的,所以我们写一个类继承SQLiteOpenHelper类(这是个抽象类),而且需要在这个类中实现三个方法:构造函数,onCreate,onUpgrade

1 package com.example.app; 2 3 import android.annotation.SuppressLint; 4 import android.content.Context; 5 import android.database.Cursor; 6 import android.database.sqlite.*; 7 8 public class DatabaseHelper extends SQLiteOpenHelper { //带全部参数的构造函数,name为数据库名称 9 public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){ 10 super(context,name,factory,version); 11 } 12 13 @Override 14 public void onCreate(SQLiteDatabase db) { //建表 15 db.execSQL("CREATE TABLE information(\n" + 16 " id INTEGER PRIMARY KEY NOT NULL,\n" + 17 " name TEXT NOT NULL,\n" + 18 " sex TEXT NOT NULL,\n" + 19 " class TEXT NOT NULL\n" + 20 " )"); 21 db.execSQL("INSERT into information(id,name,sex,class) VALUES (202001,\"张三\",\"男\",\"嵌入式1班\");"); 22 db.execSQL("INSERT into information(id,name,sex,class) VALUES (202002,\"王乐\",\"男\",\"嵌入式1班\");"); 23 db.execSQL("INSERT into information(id,name,sex,class) VALUES (202003,\"刘小慧\",\"女\",\"网编1班\");"); 24 } 25 26 @Override 27 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//简单demo,就不写这个了 28 29 } 30 //只有conCreate()和onUpgrade是抽象方法,所以重写, 31 32 }

然后写Mainactivity,思路就是点击相对应的按钮做出相对应的操作

package com.example.app; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.*; public class MainActivity extends AppCompatActivity { private EditText Student_ID; private EditText Student_NAME; private EditText Student_CLASS; private RadioGroup Student_SEX; private RadioButton Student_BOY; private RadioButton Student_GIRL; private Button Stdudent_ADD; private Button Stdudent_MV; private Button Stdudent_RM; private Button Stdudent_FIND; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.homework_9_1); //5. //4.因为我们都在mainactivity上操作,所以就不提前在sqllit上建库了,直接在这个建库,开始运行时就把库先建好 final DatabaseHelper databaseHelper = new DatabaseHelper(this,"ciec.db",null,2); SQLiteDatabase db = databaseHelper.getWritableDatabase(); // 这里先用.getreadableDatebase查一下 //databaseHelper.exitDataBase(db); //1.对学号姓名班级进行实例化 Student_ID = (EditText) findViewById(R.id.Stdudent_ID); Student_NAME = (EditText) findViewById(R.id.Stdudent_NAME); Student_CLASS = (EditText) findViewById(R.id.Student_CLASS); //2.实例化和监听性别选项 Student_SEX = (RadioGroup) findViewById(R.id.Student_SEX); Student_BOY = (RadioButton) findViewById(R.id.Student_BOY); Student_GIRL = (RadioButton) findViewById(R.id.Student_GIRL); //Student_SEX.setOnCheckedChangeListener(new MyRadioButtonListener()); //10.应该在点击按钮的时候获取这个单选的值 //6.获取输入框的内容 // final String id = Student_ID.getText().toString().trim(); // final String name = Student_NAME.getText().toString().trim(); // final String classes = Student_CLASS.getText().toString().trim(); //3.然后写增删改查功能 Stdudent_ADD = (Button) findViewById(R.id.Stdudent_ADD);//增 Stdudent_ADD.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String id = Student_ID.getText().toString().trim(); final String name = Student_NAME.getText().toString().trim(); final String classes = Student_CLASS.getText().toString().trim(); String sex = "0"; if (Student_GIRL.isChecked()){ sex = "女"; } if(Student_BOY.isChecked()){ sex = "男"; } //8.我们设置的是学号姓名班级和性别都不能为空,所以进行判断 if (id.isEmpty() | name.isEmpty() | classes.isEmpty() | sex.equals("0")){//为null,则弹出提示框 使用isempty方法代替equals Toast.makeText(MainActivity.this,"请将信息全部填完!!!",Toast.LENGTH_SHORT).show(); }else{ //7.将输入的内容插入数据库 //9.因为学号唯一,所以我们还得判断数据库中是否已经存在,如果存在则肯定不能插入了,否则和修改没啥区别了 SQLiteDatabase db = databaseHelper.getWritableDatabase(); //获得写入模式的数据库 ContentValues values = new ContentValues(); //db.execSQL("select _id from information where _id = "+ id +";"); Cursor cursor = db.query("information", new String[]{"id"},"id = ?", new String[] {id}, null, null, null); if(cursor.getCount()>0){ Toast.makeText(MainActivity.this,"学生信息已经存在!!!",Toast.LENGTH_SHORT).show(); }else { values.put("id",id); values.put("name",name); values.put("sex", sex); values.put("class",classes); db.insert("information",null,values); Toast.makeText(MainActivity.this,"增加成功!!!",Toast.LENGTH_SHORT).show(); } } } }); Stdudent_MV = (Button) findViewById(R.id.Stdudent_MV);//改 Stdudent_MV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String id = Student_ID.getText().toString().trim(); final String name = Student_NAME.getText().toString().trim(); final String classes = Student_CLASS.getText().toString().trim(); String sex = "0"; if (Student_GIRL.isChecked()){ sex = "女"; } if(Student_BOY.isChecked()){ sex = "男"; } //修改必须有学号,所以点击修改按钮时就会覆盖相对应的学号的其他的值, //就是说学号必须有,如果学号对应的账号信息被删除,则应该提示无此学生信息 if (id.isEmpty()){ Toast.makeText(MainActivity.this,"学号不能为空!!!",Toast.LENGTH_SHORT).show(); }else { SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values2 = new ContentValues(); ContentValues values3 = new ContentValues(); ContentValues values4 = new ContentValues(); Cursor cursor = db.query("information", new String[]{"id"},"id = ?", new String[] {id}, null, null, null); if (cursor.getCount()>0){ values2.put("name",name); values3.put("sex", sex); values4.put("class",classes); db.update("information",values2,"id = ?",new String[]{id}); db.update("information",values3,"id = ?",new String[]{id}); db.update("information",values4,"id = ?",new String[]{id}); Toast.makeText(MainActivity.this,"修改成功!!!",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(MainActivity.this,"无此学生!!!",Toast.LENGTH_SHORT).show(); } } } }); Stdudent_RM = (Button) findViewById(R.id.Stdudent_RM);//删 Stdudent_RM.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String id = Student_ID.getText().toString().trim(); final String name = Student_NAME.getText().toString().trim(); final String classes = Student_CLASS.getText().toString().trim(); //删除只需要有学号就可以 if(id.equals("")){ Toast.makeText(MainActivity.this,"学号不能为空!!!",Toast.LENGTH_SHORT).show(); }else { SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.delete("information","id=?",new String[]{id}); Toast.makeText(MainActivity.this,"删除成功!!!",Toast.LENGTH_SHORT).show(); } } }); Stdudent_FIND = (Button) findViewById(R.id.Stdudent_FIND);//查 Stdudent_FIND.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //这里跳转到另一个activity startActivity(new Intent(MainActivity.this,SecondActivity.class)); } }); } // static class MyRadioButtonListener implements RadioGroup.OnCheckedChangeListener { //单选的类 // @Override // public void onCheckedChanged(RadioGroup group, int checkedId) { // String sex; // // 选中状态改变时被触发 // switch (checkedId) { // case R.id.Student_GIRL: // // 当用户选择女性时 // sex = "女"; // break; // case R.id.Student_BOY: // // 当用户选择男性时 // sex = "男"; // break; // } // } // } }

 

然后写Secondactivity

没啥好说的,就是查询,然后将数据展示出来

这里说一个知识点

 

 

1 package com.example.app; 2 3 import androidx.appcompat.app.AppCompatActivity; 4 import androidx.appcompat.app.AlertDialog; 5 6 import android.database.Cursor; 7 import android.database.sqlite.SQLiteDatabase; 8 import android.text.TextUtils; 9 10 import android.os.Bundle; 11 import android.view.LayoutInflater; 12 import android.view.View; 13 import android.view.ViewGroup; 14 import android.widget.ArrayAdapter; 15 import android.widget.BaseAdapter; 16 import android.widget.ListView; 17 import android.widget.TextView; 18 19 import java.util.ArrayList; 20 21 public class SecondActivity extends AppCompatActivity { 22 23 private ListView Student_ALL; 24 String[] data; 25 ArrayList stringArrayList = new ArrayList(); 26 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.homework_9_2); 31 final DatabaseHelper databaseHelper = new DatabaseHelper(this,"ciec.db",null,2); 32 33 Student_ALL = (ListView) findViewById(R.id.Student_ALL); 34 35 SQLiteDatabase db = databaseHelper.getWritableDatabase(); 36 Cursor cursor = db.query("information", new String[]{"id","name","sex","class"}, null, null, null, null, null); 37 String textview_data = ""; 38 //利用游标遍历所有数据对象 39 //为了显示全部,把所有对象连接起来,放到TextView中 40 while(cursor.moveToNext()){ 41 String qwe = cursor.getString(cursor.getColumnIndex("id")); 42 String asd = cursor.getString(cursor.getColumnIndex("name")); 43 String zxc = cursor.getString(cursor.getColumnIndex("sex")); 44 String qaz = cursor.getString(cursor.getColumnIndex("class")); 45 textview_data = qwe + "--" + asd +"--" + zxc +"--" + qaz; 46 stringArrayList.add(textview_data); 47 } 48 //利用arraylist,保存数据,然后在转换成String[]数组 49 String [] stringArray = stringArrayList.toArray(new String[stringArrayList.size()]); 50 data = stringArray; 51 //多余的一行注释掉ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,R.id.LS);//新建并配置ArrayAapeter 52 MyBaseAdapter mAdapter = new MyBaseAdapter(); 53 Student_ALL.setAdapter(mAdapter); 54 } 55 56 class MyBaseAdapter extends BaseAdapter { 57 58 @Override 59 public int getCount() { 60 return data.length; 61 } 62 @Override 63 public Object getItem(int position) { 64 return null; 65 } 66 @Override 67 public long getItemId(int position) { 68 return 0; 69 } 70 @Override 71 public View getView(int position, View convertView, ViewGroup parent) { 72 ViewHolder holder; 73 if(convertView == null){ 74 convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.homework_five_2,parent,false); 75 holder = new ViewHolder(); 76 holder.mTextView = (TextView) convertView.findViewById(R.id.tv); 77 convertView.setTag(holder); 78 }else { 79 holder = (ViewHolder) convertView.getTag(); 80 } 81 holder.mTextView.setText(data[position]); 82 return convertView; 83 } 84 class ViewHolder { 85 TextView mTextView; 86 } 87 } 88 }

最后的成品:

 

到了总结的时候啦!

插入数据:

首先需要new一个ContentValues,内容值对象。 所谓的内容值,就是一个K,V 键值对,K指明字段名称即列名称,V指明字段值,即单元格内容。然后将这个键值对放到ContentValues的对象values里面,再把携带着键值对的对象values插入user表中 1 ContentValues values = new ContentValues(); 2 values.put("id",id); 3 db.insert("information",null,values);

删除数据:

db.delete("information","id=?",new String[]{id});

第一个参数是表名,第二个参数是删除条件,第三个参数就是你要删除的值,简单理解就是它会赋值给第二个参数的问号。

修改数据:

和插入数据相似,.update中的第一个参数是表名,第二个参数就是我们要修改的列名和值,第三个参数是修改条件,第四个参数是修改条件的值

1 ContentValues values2 = new ContentValues(); 2 values2.put("name",name); 3 db.update("information",values2,"id = ?",new String[]{id});

查询数据:

频繁的用到查询语句,然后查询语句也是我花时间最长的

Cursor cursor = db.query("information", new String[]{"id"},"id = ?", new String[] {id}, null, null, null);

这句写在插入功能,使用了Cursor游标进行查询,后面的循环遍历所有数据就不说了,单说一下这条语句

cursor就是游标对象,查询函数是.query,第一个参数是表名,第二个参数就是select * from 表名 where name = “”;中的*号,第三个参数就是查询条件(where后跟的name = ),第四个参数是查询条件的值,再往后的几个参数就是各种查询约束了,在上面的查询知识点说的很清楚。

还有一种查询函数是.rawQuery,这种查询方式是这样的

.rawQuery(sql,selectionArgs)

第一个参数是sql语句,第二个参数要么是null,要么必须是一个字符串数组,还有第三个参数,没用过不知道是啥

比如这样

Cursor cursor = db.rawQuery("select name from * where id=?", new String[]{"1"});

这两个函数的主要区别是rawQuery是直接使用SQL语句进行查询的,也就是第一个参数字符串,在字符串内的“?”会被后面的String[]数组逐一对换掉;而query函数是Android自己封装的查询API

 

写代码的时候有好多问题要总结的,结果写博客的时候发现都忘光了,不知道该写什么,哭

补一张图:

 

 

加油,未来可期!

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有